package com.robotic.sensor.service;

import java.util.List;
import java.util.Date;
import com.robotic.sensor.domain.SensorData;

/**
 * 传感器数据Service接口
 * 
 * @author robotic
 * @date 2024-01-20
 */
public interface ISensorDataService
{
    /**
     * 查询传感器数据
     * 
     * @param id 传感器数据主键
     * @return 传感器数据
     */
    public SensorData selectSensorDataById(Long id);

    /**
     * 查询传感器数据列表
     * 
     * @param sensorData 传感器数据
     * @return 传感器数据集合
     */
    public List<SensorData> selectSensorDataList(SensorData sensorData);

    /**
     * 根据区域代码查询传感器数据
     * 
     * @param regionCode 区域代码
     * @return 传感器数据集合
     */
    public List<SensorData> selectSensorDataByRegionCode(String regionCode);

    /**
     * 根据传感器类型查询传感器数据
     * 
     * @param sensorType 传感器类型
     * @return 传感器数据集合
     */
    public List<SensorData> selectSensorDataBySensorType(String sensorType);

    /**
     * 根据机器人ID查询传感器数据
     * 
     * @param robotId 机器人ID
     * @return 传感器数据集合
     */
    public List<SensorData> selectSensorDataByRobotId(String robotId);

    /**
     * 根据任务ID查询传感器数据
     * 
     * @param taskId 任务ID
     * @return 传感器数据集合
     */
    public List<SensorData> selectSensorDataByTaskId(String taskId);

    /**
     * 查询异常传感器数据（非标准数据）
     * 
     * @param regionCode 区域代码（可选）
     * @param sensorType 传感器类型（可选）
     * @return 传感器数据集合
     */
    public List<SensorData> selectAbnormalSensorData(String regionCode, String sensorType);

    /**
     * 查询未处理的异常传感器数据
     * 
     * @return 传感器数据集合
     */
    public List<SensorData> selectUnhandledAbnormalSensorData();

    /**
     * 查询危险级别的传感器数据
     * 
     * @param regionCode 区域代码（可选）
     * @param sensorType 传感器类型（可选）
     * @return 传感器数据集合
     */
    public List<SensorData> selectDangerSensorData(String regionCode, String sensorType);

    /**
     * 根据时间范围查询传感器数据
     * 
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param regionCode 区域代码（可选）
     * @param sensorType 传感器类型（可选）
     * @return 传感器数据集合
     */
    public List<SensorData> selectSensorDataByTimeRange(Date startTime, Date endTime, String regionCode, String sensorType);

    /**
     * 查询最新的传感器数据
     * 
     * @param regionCode 区域代码
     * @param sensorType 传感器类型
     * @param limit 限制条数
     * @return 传感器数据集合
     */
    public List<SensorData> selectLatestSensorData(String regionCode, String sensorType, Integer limit);

    /**
     * 统计传感器数据数量
     * 
     * @param regionCode 区域代码（可选）
     * @param sensorType 传感器类型（可选）
     * @param detectStatus 检测状态（可选）
     * @return 数据数量
     */
    public Long countSensorData(String regionCode, String sensorType, String detectStatus);

    /**
     * 新增传感器数据
     * 
     * @param sensorData 传感器数据
     * @return 结果
     */
    public int insertSensorData(SensorData sensorData);

    /**
     * 批量新增传感器数据
     * 
     * @param sensorDataList 传感器数据列表
     * @return 结果
     */
    public int batchInsertSensorData(List<SensorData> sensorDataList);

    /**
     * 修改传感器数据
     * 
     * @param sensorData 传感器数据
     * @return 结果
     */
    public int updateSensorData(SensorData sensorData);

    /**
     * 更新传感器数据处理状态
     * 
     * @param id 传感器数据主键
     * @param handleStatus 处理状态
     * @param handleBy 处理人
     * @param handleRemark 处理备注
     * @return 结果
     */
    public int updateSensorDataHandleStatus(Long id, String handleStatus, String handleBy, String handleRemark);

    /**
     * 批量更新传感器数据处理状态
     * 
     * @param ids 传感器数据主键集合
     * @param handleStatus 处理状态
     * @param handleBy 处理人
     * @param handleRemark 处理备注
     * @return 结果
     */
    public int batchUpdateSensorDataHandleStatus(Long[] ids, String handleStatus, String handleBy, String handleRemark);

    /**
     * 批量删除传感器数据
     * 
     * @param ids 需要删除的传感器数据主键集合
     * @return 结果
     */
    public int deleteSensorDataByIds(Long[] ids);

    /**
     * 删除传感器数据信息
     * 
     * @param id 传感器数据主键
     * @return 结果
     */
    public int deleteSensorDataById(Long id);

    /**
     * 根据时间范围删除传感器数据
     * 
     * @param beforeTime 删除此时间之前的数据
     * @return 结果
     */
    public int deleteSensorDataByTime(Date beforeTime);

    /**
     * 清理历史传感器数据（保留最近N天的数据）
     * 
     * @param keepDays 保留天数
     * @return 结果
     */
    public int cleanHistorySensorData(Integer keepDays);

    /**
     * 处理实时传感器数据（包含判断和保存）
     * 
     * @param sensorData 传感器数据对象
     * @return 处理结果
     */
    public boolean processRealtimeSensorData(SensorData sensorData);

    /**
     * 处理实时传感器数据（包含判断和保存）
     * 
     * @param regionCode 区域代码
     * @param sensorType 传感器类型
     * @param value 传感器值
     * @param robotId 机器人ID
     * @param taskId 任务ID
     * @param coordinateX X坐标
     * @param coordinateY Y坐标
     * @param coordinateZ Z坐标
     * @return 处理结果
     */
    public SensorData processRealtimeSensorData(String regionCode, String sensorType, Double value, 
                                               String robotId, String taskId, 
                                               Double coordinateX, Double coordinateY, Double coordinateZ);

    /**
     * 获取传感器数据统计报告
     * 
     * @param regionCode 区域代码（可选）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计报告
     */
    public String getSensorDataStatisticsReport(String regionCode, Date startTime, Date endTime);

    /**
     * 导出传感器数据
     * 
     * @param sensorData 查询条件
     * @return 传感器数据列表
     */
    public List<SensorData> exportSensorData(SensorData sensorData);
}